import asyncio
import json

from bot.insurance_planner_gpt import context_local_util
from bot.insurance_planner_gpt.agent.base_agent import LLMAgent
from common.log import logger
from util_tool import utils


class JudgeTransferAgent(LLMAgent):
    prompt_template = """
角色：你是惠择保险的一名顾问助理
任务：一步步思考分析你和用户的对话记录，判断当前是否需要转接给人工。

需要转人的情况包括：


1. 理赔
    - 用户询问怎么理赔，需要什么流程，需要准备什么材料等
2. 健康告知
    - 用户询问：我有xx病能不能买这个保险（我想保肿瘤疾病不算）
3. 其他：
    - 用户说要去找人工客服

注意：
- 除了以上需要转人的情况之外，其他情况都不需要转人。
- 只要符合以上一种情况就转人


===
对话记录：
{conversation_history}

输出格式：
json格式，包含以下字段：
analysis：详细分析步骤，根据上面每一种转人情况一步步思考，分析字数限制在100字以内
transfer_reason：转人原因，如果不转人，该字段为空；如果有多个原因用"；"分割
transfer_flag：是否需要转人，true或false


现在输出你的结果：
"""

    def __init__(self, conversation_history):
        if conversation_history:
            self.conversation_history = "当前用户情境：\n===\n" + str(conversation_history) + "\n===\n"
        else:
            self.conversation_history = ""

        self.conversation_history = conversation_history
        self.prompt = self.prompt_template.format(conversation_history=self.conversation_history)
        super().__init__(self.prompt)


async def planner_judge_transfer(conversation_history):
    session_id = context_local_util.get_session_id()
    transfer_judge = JudgeTransferAgent(conversation_history)
    res = await transfer_judge.achat_auto_llm(type="gpt")
    try:
        transfer_result = parse_res_for_json(res)
    except Exception :
        transfer_result = {"transfer_flag": False}
    logger.info(f"当前会话:[{session_id}] 转人判断 输出结果是: \n{transfer_result}")
    return transfer_result


def parse_res_for_json(res):
    try:
        if type(res) == str and res != 'abandon':
            res = json.loads(res)
        else:
            res = {'transfer_flag': False, 'transfer_reason': ''}
    except Exception as e:
        try:
            json_str = str(res).replace("```json", "").replace("```", "")
            res = json.loads(json_str)
        except:
            res = {'transfer_flag': False, 'transfer_reason': ''}
    return res


if __name__ == '__main__':
    conversation_history = """

    犀心小助：太棒了，关注个人医疗保障是非常明智的选择！首先，我们需要明确一下具体的医疗保险类型，比如普通的医疗险、重疾险或者是医疗意外险等。😊 每种类型的医疗险在保障内容和保费上都有所不同。为了更好地为您提供个性化的建议，能否先告诉我您对保险的预算范围？这样我可以帮您筛选出既符合预算又能满足您需求的产品。同时，如果您对理赔的快速性有特别的要求，也请告诉我，我会优先考虑理赔服务快速的医疗险产品。当然啦，如果您有其他的特定偏好或需求，也请不吝告知，我会用心为您定制保障方案。🌈

    用户：我预算每年10000元 先考虑下重疾险吧  理赔速度肯定越快越好
    犀心小助：
    嗯，年预算10000元选择重疾险是个不错的方案👍，而且我完全能理解您希望理赔速度快的需求。接下来，为了让我能够更准确地帮您找到合适的保险产品，还需要了解一些其他信息：
    1. 请问您的年龄范围？这有助于我们计算保费和为您推荐相应年龄段的产品。
    2. 您的健康状况怎么样？比如有没有既往病史，这可能会影响到保险公司的承保条款。
    3. 您对保险保障内容有没有特别的要求？比如关注的病种是否广泛，或者对某一类疾病想要更高的保障。
    4. 您比较倾向于短期保障还是长期保障？这样我才能帮您筛选出保障期限符合您需求的产品。
    5. 对于保额，您希望在什么范围内？比如是希望有足够的保额来覆盖可能的大额医疗费用，还是仅需要基本保障？
    能够获得这些信息后，我就可以为您精准推荐，找到性价比高、理赔效率高、保单条款简明、适合您需求的重疾险产品啦！🏆📑
    用户：我今年30岁  现在很健康 我想保障下肿瘤的治疗
     """
    transfer_res = asyncio.run(planner_judge_transfer(conversation_history))
    print(transfer_res)
